#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/4/4 20:16
# @Author  :  一Carrycao
# @File    : toast_monitor.py
# @Software: PyCharm
import threading
import time
import logging

import minium
from minium import NoSuchElementException

# 设置日志配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')


class ToastMonitor(minium.MiniTest):
    def __init__(self):
        super().__init__()
        self.lock = threading.Lock()

    def _monitor_for_error_toast(self, stop_event, error_message="操作失败"):
        """
        后台线程方法，用于持续监控错误Toast。
        :param stop_event: 用于控制线程退出的事件对象
        :param error_message: 需要监控的错误消息文本，默认为"操作失败"
        """
        while not stop_event.is_set():
            with self.lock:  # 使用锁确保线程安全
                try:
                    error_toast_xpath = f'//*[contains(@text, "{error_message}")]'
                    error_toast = self.get_element(error_toast_xpath)
                    if error_toast.is_displayed():
                        logging.error("检测到操作失败的Toast，测试用例失败")
                        stop_event.set()  # 设置事件，停止主流程
                except NoSuchElementException:
                    # 如果没有找到错误Toast，则继续监控
                    pass
                except Exception as e:
                    logging.error(f"监控过程中出现异常: {e}")
                    stop_event.set()
            time.sleep(1)  # 控制检查频率，避免过于频繁的查询影响性能

    def start_toast_monitor(self, error_message="操作失败"):
        """
        启动错误Toast的后台监控线程。
        """
        stop_event = threading.Event()
        toast_monitor_thread = threading.Thread(target=self._monitor_for_error_toast, args=(stop_event, error_message))
        toast_monitor_thread.daemon = True  # 设置为守护线程，主程序结束时自动关闭
        toast_monitor_thread.start()
        return stop_event


# 示例用法
toast_monitor = ToastMonitor()
stop_event = toast_monitor.start_toast_monitor()
# 模拟测试用例执行过程，这里可以插入需要执行的测试代码
# ...
# 当需要停止监控时
stop_event.set()
